import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'
// import router from '@/router'

// 创建 axios 实例
const service = axios.create({
  baseURL: '/common',
  timeout: 20 * 1000 // 请求超时 20s
})

// request 拦截器
service.interceptors.request.use(
  config => {
    config.headers['Content-Type'] = 'application/json'
    // if (store.getters.expirationTime) {
    //   config.headers['expirationTime'] = store.getters.expirationTime
    // }
    // 如果有token，token 放入请求头的 X-Token 中
    if (config.url !== '/common/login' && store.getters.token) {
      config.headers['Authorization'] = getToken()

      // config.transformRequest = [function(data) {
      //   // 处理POST请求参数，把token加到请求参数里，后台匹配请求头里的token和请求参数里的token，防CSRF
      //   if ((typeof data) === 'object') {
      //     data.append('antiToken', getToken())
      //     return data
      //   }
      //   return data + '&antiToken=' + getToken()
      // }]
    }
    // 如果有 companyId，companyId 放入请求参数中
    // if (config.url !== '/common/login' && store.getters.companyId && config.url.indexOf('/iot/') === -1) {
    if (config.url !== '/common/login' && store.getters.companyId && config.url.indexOf('/iot/iot/') === -1) {
      config.transformRequest = [function(data) {
        if ((typeof data) === 'object') {
          data.companyId = store.getters.companyId
          return data
        }
        return data + '&companyId=' + store.getters.companyId
      },
      ...axios.defaults.transformRequest
      ]
      if (config.method === 'post' && config.data === undefined) {
        config.data = {
          companyId: store.getters.companyId
        }
      }
    }

    return config
  },
  error => {
    console.log(error) // for debug
    return Promise.reject(error)
  }
)

// response 拦截器
service.interceptors.response.use(
  response => {
    if (response.data.size) {
      response.data['code'] = 200
    }
    const resCode = response.data.code
    switch (resCode) { // 校验返回code
      case 200: // 成功
        return response.data
      case 401: // 需要登录 或 登录超时
        store.dispatch('user/resetToken').then(() => {
          location.reload()
        })
        break
      // case 403:
      //   MessageBox.alert('注册码到期，请输入新的注册码!', null, {
      //     confirmButtonText: '确认'
      //   }).then(() => {
      //     // 注册跳转
      //     router.push('/register')
      //   })
      //   break
      // case 'download':
      //   return response
      default:
        if (response.data.msg == null || response.data.msg.indexOf('exception') != -1 || response.data.msg.length > 200) {
          console.log(response.data.msg)
          Message({
            message: '发生未知错误，请联系系统管理员。',
            type: 'error',
            duration: 2000
          })
        } else {
          Message({
            message: response.data.msg,
            type: 'error',
            duration: 2000
          })
        }
        store.state.app.loadingFull = false
        return new Promise((resolve, reject) => { reject() })
    }
  },
  error => { // response 出错
    Message({
      message: error,
      type: 'error',
      duration: 2000
    })
  }
)

export default service
